﻿using System;
using System.Data;
using System.Data.SqlClient;
using System.Runtime.CompilerServices;
using AccesoDatos.DTO;
using System.Collections.Generic;
using AccesoDatos.DAO.Base;
using AccesoDatos.DTO.Base;
using AccesoDatos.DTO;

namespace AccesoDatos.DAO
{

    /// <summary>
    /// Descripcion breve de RenglonDocumentacionDAO
    /// </summary>
    public class RenglonDocumentacionDAO : BaseDAO, IDAO
    {

        #region Singleton

        private static RenglonDocumentacionDAO instance;

        private RenglonDocumentacionDAO()
        {
            //Vacio
        }

        /// <summary>
        /// Devuelve una instancia de RenglonDocumentacionDAO
        /// </summary>
        /// <returns>instancia de RenglonDocumentacionDAO</returns>
        [MethodImpl(MethodImplOptions.Synchronized)]
        public static RenglonDocumentacionDAO GetInstance()
        {
            if (instance == null)
            {
                instance = new RenglonDocumentacionDAO();
            }

            return instance;
        }

        #endregion

        #region Metodos privados

        /// <summary>
        /// Funcion que rellena el bean con los valores obtenidos en DataReader
        /// </summary>
        /// <param name="dr">DataReader que contiene todos los valores directos de la base de datos</param>
        /// <returns>DTO Relleno con los valores obtenidos</returns>
        private RenglonDocumentacionDTO RellenaBean(SqlDataReader dr)
        {
            RenglonDocumentacionDTO bean = new RenglonDocumentacionDTO();
            bean.CoRenglon = this.GetNullableIntFromDataReader(dr, "CO_RENGLON");
            bean.CoRenglonDocumentacion = this.GetNullableIntFromDataReader(dr, "CO_RENGLON_DOCUMENTACION");
            bean.FchEntrega = this.GetNullableDateTimeFromDataReader(dr, "FCHENTREGA");
            bean.CoAlumno = this.GetNullableIntFromDataReader(dr, "CO_ALUMNO");
            bean.CalificacionPractica = this.GetNullableDoubleFromDataReader(dr, "CALIFICACIONPRACTICA");
            bean.CoConvocatoria = this.GetNullableIntFromDataReader(dr, "CO_CONVOCATORIA");
            bean.NombreAlumno = this.GetStringFromDataReader(dr, "NOMBREALUMNO");
            bean.Apellido1Alumno = this.GetStringFromDataReader(dr, "APELLIDO1ALUMNO");
            bean.Apellido2Alumno = this.GetStringFromDataReader(dr, "APELLIDO2ALUMNO");
            bean.DniAlumno = this.GetStringFromDataReader(dr, "DNIALUMNO");

            return bean;

        }

        #endregion

        #region Miembros de IDAO

        /// <summary>
        /// Metodo que inserta un registro de foro en la base de datos
        /// </summary>
        /// <param name="dto">Objeto IDTO que contiene todos los parametros para insertar</param>
        public void Insert(IDTO dto)
        {
            RenglonDocumentacionDTO filtro = new RenglonDocumentacionDTO();
            filtro = (RenglonDocumentacionDTO)dto;
            try
            {
                string sql = "spu_RenglonDocumentacionDAO_Insert";
                SqlCommand cmd = new SqlCommand(sql, this.ConexionIntegra);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@CoRenglon", GetSqlValue(filtro.CoRenglon));
                cmd.Parameters.AddWithValue("@CalificacionPractica", GetSqlValue(filtro.CalificacionPractica));
                cmd.Parameters.AddWithValue("@CoAlumno", GetSqlValue(filtro.CoAlumno));
                cmd.Parameters.AddWithValue("@CoConvocatoria", GetSqlValue(filtro.CoConvocatoria));
                cmd.Parameters.AddWithValue("@CoRenglonDocumentacion", GetSqlValue(filtro.CoRenglonDocumentacion));
                cmd.Parameters.AddWithValue("@FchEntrega", GetSqlValue(filtro.FchEntrega));

                cmd.ExecuteNonQuery();
            }
            catch (SqlException ex)
            {
                throw new DAOException(GetErrorSqlPersonalizado(ex));
            }
            catch (Exception ex)
            {
                throw new DAOException(ex);
            }
        }

        /// <summary>
        /// Metodo que elimina un registro de foro dentro de la base de datos
        /// </summary>
        /// <param name="dto"></param>
        public void Delete(IDTO dto)
        {
            RenglonDTO filtro = new RenglonDTO();
            filtro = (RenglonDTO)dto;
            try
            {
                string sql = "spu_RenglonDocumentacionDAO_Delete";
                SqlCommand cmd = new SqlCommand(sql, this.ConexionIntegra);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@CoRenglonDocumentacion", GetSqlValue(filtro.CoRenglon));

                cmd.ExecuteNonQuery();
            }
            catch (SqlException ex)
            {
                throw new DAOException(GetErrorSqlPersonalizado(ex));
            }
            catch (Exception ex)
            {
                throw new DAOException(ex);
            }
        }

        /// <summary>
        /// Metodo que actualiza un registro de foro dentro de la base de datos
        /// </summary>
        /// <param name="dto">Objeto IDTO que contiene los parametros a actualizar</param>
        public void Update(IDTO dto)
        {
            RenglonDocumentacionDTO filtro = new RenglonDocumentacionDTO();
            filtro = (RenglonDocumentacionDTO)dto;
            try
            {
                string sql = "spu_RenglonDocumentacionDAO_Update";
                SqlCommand cmd = new SqlCommand(sql, this.ConexionIntegra);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@CoRenglon", GetSqlValue(filtro.CoRenglon));
                cmd.Parameters.AddWithValue("@CoRenglonDocumentacion", GetSqlValue(filtro.CoRenglonDocumentacion));
                cmd.Parameters.AddWithValue("@FchEntrega", GetSqlValue(filtro.FchEntrega));
                cmd.Parameters.AddWithValue("@CoAlumno", GetSqlValue(filtro.CoAlumno));
                cmd.Parameters.AddWithValue("@CalificacionPractica", GetSqlValue(filtro.CalificacionPractica));
                cmd.Parameters.AddWithValue("@CoConvocatoria", GetSqlValue(filtro.CoConvocatoria));
                


                cmd.ExecuteNonQuery();
            }
            catch (SqlException ex)
            {
                throw new DAOException(GetErrorSqlPersonalizado(ex));
            }
            catch (Exception ex)
            {
                throw new DAOException(ex);
            }
        }

        /// <summary>
        /// Funcion que devuelve un lista de foros
        /// </summary>
        /// <param name="dto">Objeto IDTO que contiene los parametros de busqueda</param>
        /// <returns></returns>
        public List<IDTO> Get(IDTO dto)
        {
            RenglonDocumentacionDTO filtro = new RenglonDocumentacionDTO();
            filtro = (RenglonDocumentacionDTO)dto;
            try
            {
                string sql = @"spu_RenglonDocumentacionDAO_GetRenglonesDocumentacion";

                List<IDTO> lista = new List<IDTO>();

                SqlCommand cmd = new SqlCommand(sql, this.ConexionIntegra);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@CoRenglon", GetSqlValue(filtro.CoRenglon));
                cmd.Parameters.AddWithValue("@CoRenglonDocumentacion", GetSqlValue(filtro.CoRenglonDocumentacion));
                cmd.Parameters.AddWithValue("@FchEntrega", GetSqlValue(filtro.FchEntrega));
                cmd.Parameters.AddWithValue("@CoAlumno", GetSqlValue(filtro.CoAlumno));
                cmd.Parameters.AddWithValue("@CalificacionPractica", GetSqlValue(filtro.CalificacionPractica));
                cmd.Parameters.AddWithValue("@CoConvocatoria", GetSqlValue(filtro.CoConvocatoria));
                cmd.Parameters.AddWithValue("@NombreAlumno", GetSqlValue(filtro.NombreAlumno));
                cmd.Parameters.AddWithValue("@Apellido1Alumno", GetSqlValue(filtro.Apellido1Alumno));
                cmd.Parameters.AddWithValue("@Apellido2Alumno", GetSqlValue(filtro.Apellido2Alumno));
                cmd.Parameters.AddWithValue("@DniAlumno", GetSqlValue(filtro.DniAlumno));

                
                using (SqlDataReader dr = cmd.ExecuteReader())
                {
                    while (dr.Read())
                    {
                        RenglonDocumentacionDTO bean = new RenglonDocumentacionDTO();

                        bean=RellenaBean(dr);

                        lista.Add(bean);
                    }
                }
                return lista;
            }
            catch (Exception ex)
            {
                throw new DAOException(ex);
            }
        }

        #endregion
    }
}